package com.atguigu.springbootdemo.controller;

import com.atguigu.springbootdemo.bean.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Map;

/**
 * Created by Smexy on 2022/12/5
 *
 *  路径的话在java代码中，可以省略 协议，主机名，端口
 *
 *
 *  @Controller:
 *          1：标识当前这个类时控制器，给自己看
 *          2：这个注解标注的类，被容器扫描到后，会自动在容器中创建一个单例对象，在需要调用时自动返回对象
 *
 *
 *          url和方法要唯一绑定！不能出现两个方法都可以处理同一个url，产生歧义。
 *
 *     404: 资源为找到。
 *              客户端请求的资源，服务端的程序无法处理！
 *                  原因：  客户端的url写错了
 *                         服务端没有方法可以处理请求的url
 *
 *     405:  请求方法错误。
 *              url发送的请求和后端程序的要求不匹配。
 *                  限定post，发get。报错
 *
 *     5xx:   服务端错误
 *              java代码报错了
 */
@Controller
public class HelloController
{
    //提供方法处理页面发送的hello
    //请求映射：  绑定当前方法处理的url  点击后，发送 http://localhost:8080/hello
    @RequestMapping(value = "/hello")
    public Object handle(){

        System.out.println("收到了请求...");

        int i = 1/0;

        //希望访问a.html  http://localhost:8080/a.html
        return "/a.html";

    }

    /*
            回复数据： 开发数据接口（俗称写接口）

                    字面量:  字面上就知道变量值的变量。
                        常见的基本数据类型和包装类，String
                        String a = "haha";
                        int i = 0;

                        控制器是直接返回！

                    非字面量:  字面上不知道变量值的变量。
                          Employee a =  new Employee()

                         控制器会把变量转为json再返回

            字面量


            给你 /getData
            希望你返回:  { xxx,xxx }
     */
    @ResponseBody  //把返回值直接作为数据写入到响应体，返回给页面
    @RequestMapping(value = "/hello1")
    public Object handle3(){

        System.out.println("收到了请求...");


        return "/a.html";

    }

    /*
        非字面量
     */
    @ResponseBody
    @RequestMapping(value = "/hello2")
    public Object handle4(){

        System.out.println("收到了请求...");

        Employee employee = new Employee(1, "tom", "male", "aaa@163.com");

        return employee;

    }


    /*
            接受请求参数：
                    ①是普通参数
                    http://localhost:8080/requstParam?  a=1&b=2

                   在处理方法的形参位置声明和参数的name一致的形参名即可。
                   前台发送的参数是没有类型的，全部是普通文本，在后端只需要使用兼容的类型接受即可！


     */
    @RequestMapping(value = "/requstParam")
    public Object handle1(String a,Integer b){

        System.out.println("收到了请求...，a:"+a+", b:"+b);

        //希望访问a.html  http://localhost:8080/a.html
        return "/a.html";

    }

    /*
            接受请求参数：
                    ②是JSON格式的参数

                    在方法的形参位置声明一个Map 或 Bean，json中的每个属性都会作为
                        map的一个entry或封装为Bean的同名的属性


               @RequestBody:标注在方法的形参上，告诉Spring，这个注解标注的参数是用来接收json格式的请求参数的
     */
    @ResponseBody
    @RequestMapping(value = "/requstJsonParam")
    public Object handle2(@RequestBody Employee map){

        System.out.println("收到了请求..." + map.toString());

        //希望访问a.html  http://localhost:8080/a.html
        return "ok";

    }




}
